package gestorbienraizok.usuarios;

import gestorBD.Controlador;
import gestorbienraizok.contratos.*;
import java.util.Calendar;
import java.util.LinkedList;

public class Funcionario extends Persona {

    private static int totalFuncionarios = 0;
    private long salarioBase;
    LinkedList<Long> listaDeCedulasDeClientesDemandantes;
    Cita[] listaDeCitas;

    public Funcionario() {
        Funcionario.totalFuncionarios++;
    }

    public Funcionario(long cedula, String contrasenha, String nombre, long salarioBase) {
        super(cedula, contrasenha, nombre, (byte) 5);
        this.listaDeCedulasDeClientesDemandantes = new LinkedList();
        this.listaDeCitas = new Cita[16];
        this.salarioBase = salarioBase;
        Funcionario.totalFuncionarios++;
    }

    //Constructor para el jefe
    protected Funcionario(long cedula, String contrasenha, String nombre, byte nivelDeAcceso, long salario) {
        super(cedula, contrasenha, nombre, nivelDeAcceso);
        this.listaDeCedulasDeClientesDemandantes = new LinkedList();
        this.listaDeCitas = new Cita[16];
        Funcionario.totalFuncionarios++;
        this.salarioBase = salario;
    }

    public static int getTotalFuncionarios() {
        return Funcionario.totalFuncionarios;
    }

    public long getSalarioBase() {
        return this.salarioBase;
    }

    public LinkedList<Long> getListaDeCedulasDeClientesDemandantes() {
        return this.listaDeCedulasDeClientesDemandantes;
    }

    public Cita[] getListaDeCitas() {
        return this.listaDeCitas;
    }

    public static void setTotalFuncionarios(int numero) {
        Funcionario.totalFuncionarios = numero;
    }

    public void setSalarioBase(long salarioBase) {
        this.salarioBase = salarioBase;
    }

    public void setListaDeCedulasDeClientesDemandantes(LinkedList<Long> listaDeCedulasDeClientesDemandantes) {
        this.listaDeCedulasDeClientesDemandantes = listaDeCedulasDeClientesDemandantes;
    }

    public void setListaDeCitas(Cita[] listaDeCitas) {
        this.listaDeCitas = listaDeCitas;
    }

    public void anhadirALaLista(Cliente nuevoCliente) {
        this.listaDeCedulasDeClientesDemandantes.add(nuevoCliente.getCedula());
    }

    public String proximaCitaDisponible(Cita nuevaCita) {
        int i = 0;
        while (listaDeCitas[i] != null) {
            i++;
            if (i == listaDeCitas.length) {
                break;
            }
        }
        if (i == listaDeCitas.length) {
            return "";
        } else {
            String[] nombreHoras = {"8:00 am", "8:30 am", "9:00 am", "9:30 am", "10:00 am", "10:30 am", "11:00 am", "11:30 am", "2:00 pm", "2:30 pm", "3:00 pm", "3:30 pm", "4:00 pm", "4:30 pm", "5:00 pm", "5:30 pm"};
            listaDeCitas[i] = nuevaCita;
            return nombreHoras[i];
        }
    }

    public void quitarDeLaLista(Cliente clienteAQuitar) {
        this.listaDeCedulasDeClientesDemandantes.remove(clienteAQuitar.getCedula());
    }

    public ClienteAnonimo buscarEnAgendaBorrarYDevolver(long cedula) {

        for (int i = 0; i < 16; i++) {
            Cita estaCita = listaDeCitas[i];
            if (estaCita != null) {
                ClienteAnonimo esteCliente = estaCita.getClienteAnonimo();
                if (esteCliente.getCedula() == cedula) {
                    listaDeCitas[i] = null;
                    return esteCliente;
                }
            }
        }
        return null;
    }

    public static Funcionario buscarFuncionarioAsesor(long cedulaDelClienteDemandador) {
        for (int i = 0; i < Controlador.getListaDePersonas().size(); i++) {
            Persona estaPersona = Controlador.getListaDePersonas().get(i);
            if (estaPersona instanceof Funcionario) {
                Funcionario esteFuncionario = (Funcionario) estaPersona;
                for (int j = 0; j < esteFuncionario.getListaDeCedulasDeClientesDemandantes().size(); j++) {
                    long cedulaDeEsteClienteDemandador = esteFuncionario.getListaDeCedulasDeClientesDemandantes().get(j);
                    ClienteDemandador esteClienteDemandador = (ClienteDemandador) Persona.buscarPersona(cedulaDeEsteClienteDemandador);
                    if (esteClienteDemandador.getCedula() == cedulaDelClienteDemandador) {
                        return esteFuncionario;
                    }
                }
            }
        }
        return null;
    }

    public static Funcionario funcionarioAleatorio() {

        //Genera el numero del funcionario al azar       
        int aleatorio = (int) ((Funcionario.totalFuncionarios - 0) * Math.random());

        int contador = -1;
        Persona estaPersona;
        for (int i = 0; i < Controlador.getListaDePersonas().size(); i++) {
            estaPersona = Controlador.getListaDePersonas().get(i);
            if (estaPersona instanceof Funcionario) {
                contador++;
                if (contador == aleatorio) {
                    return (Funcionario) estaPersona;
                }
            }
        }
        return null;
    }

    public String[][] tablaDeClientesDemandantes() {
        int cantidadDeClientes = this.listaDeCedulasDeClientesDemandantes.size();
        String[][] tabla = new String[cantidadDeClientes][2];

        for (int i = 0; i < cantidadDeClientes; i++) {
            long cedulaDeEsteClienteDemandador = this.getListaDeCedulasDeClientesDemandantes().get(i);
            ClienteDemandador esteClienteDemandador = (ClienteDemandador) Persona.buscarPersona(cedulaDeEsteClienteDemandador);
            String nombreDeEsteClienteDemandador = esteClienteDemandador.getNombre();

            tabla[i][0] = nombreDeEsteClienteDemandador;
            tabla[i][1] = String.valueOf(cedulaDeEsteClienteDemandador);
        }

        return tabla;
    }

    public void calcularSalario(byte mes, int anho, float[] comisionPorVentas, float[] comisionPorArrendamientos) {

        for (int i = 0; i < this.getListaDeCedulasDeClientesDemandantes().size(); i++) {
            long cedulaDeEsteClienteDemandante = this.getListaDeCedulasDeClientesDemandantes().get(i);
            ClienteDemandador esteClienteDemandador = (ClienteDemandador) Persona.buscarPersona(cedulaDeEsteClienteDemandante);
            for (int j = 0; j < esteClienteDemandador.getListaDeContratos().size(); j++) {
                Contrato esteContrato = esteClienteDemandador.getListaDeContratos().get(j);
                if (esteContrato instanceof Compraventa) {
                    if (esteContrato.getMes() == mes && esteContrato.getAnho() == anho) {
                        comisionPorVentas[0] += esteContrato.getValor() * 0.05f;
                    }
                } else {
                    if (esteContrato.getMes() <= mes && esteContrato.getAnho() <= anho) {
                        comisionPorArrendamientos[0] += esteContrato.getValor() * 0.01f;
                    }
                }
            }
        }
    }

    public float calcularSalarioTotalAHoy() {
        float[] comisionPorVentas = {0};
        float[] comisionPorArrendamientos = {0};

        this.calcularSalario((byte) (Calendar.getInstance().getTime().getMonth() + 1), Calendar.getInstance().getTime().getYear() + 1900, comisionPorVentas, comisionPorArrendamientos);

        return comisionPorVentas[0] + comisionPorArrendamientos[0] + this.getSalarioBase();
    }

    @Override
    public String tipoDePersona() {
        return "funcionario";
    }
}
